package org.rslai.util.compress;

import java.io.File;
import java.util.List;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import org.apache.tools.ant.types.FileSet;

/**
 * zip 压缩解压缩工具
 * 
 * @author rslai
 */
public class Zip {

	private String encoding = "GBK"; // 编码方案

	/**
	 * 设置编码方案 ( 默认GBK )
	 * @param encoding 编码方案
	 */
	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	/**
	 * 返回编码方案
	 * @return 编码方案
	 */
	public String getEncoding() {
		return this.encoding;
	}

	/**
	 * zip 压缩
	 * @param sourcePathName 需要压缩的原目录或文件
	 * @param zipFileName 生成压缩文件的路径+文件名
	 * @return 成功返回true失败抛异常
	 */
	public boolean zip(String sourcePathName, String zipFileName) {
		return this.zip(sourcePathName, zipFileName, null, null);
	}

	/**
	 * zip 压缩
	 * @param sourcePathName 需要压缩的原目录或文件
	 * @param zipFileName 生成压缩文件的路径+文件名
	 * @param includes 包括哪些文件或文件夹，例如："**&#47;*.html" 包括所有*.html文件，包括子目录
	 * @param excludes 排除哪些文件或文件夹，例如："**&#47;*.txt" 排除所有*.txt文件，包括子目录
	 * @return 成功返回true失败抛异常
	 */
	public boolean zip(String sourcePathName, String zipFileName, List<String> includes, List<String> excludes) {
		File srcdir = new File(sourcePathName);
		Project prj = new Project();
		org.apache.tools.ant.taskdefs.Zip zip = new org.apache.tools.ant.taskdefs.Zip();
		zip.setProject(prj);
		zip.setDestFile(new File(zipFileName));
		FileSet fileSet = new FileSet();
		fileSet.setProject(prj);
		fileSet.setDir(srcdir);
		if (includes!=null) {
			for(String inc : includes) {
				fileSet.setIncludes(inc); // 包括哪些文件或文件夹
			}
		}
		if (excludes!=null) {
			for(String exc : excludes) {
				fileSet.setExcludes(exc); // 排除哪些文件或文件夹
			}
		}
		zip.addFileset(fileSet);
		zip.setEncoding(encoding);
		zip.execute();

		return true;
	}

	/**
	 * zip 解压缩
	 * @param zipFileName 需要解的压缩文件路径+文件名
	 * @param destDir 解压到的目录
	 * @return 成功返回true失败抛异常
	 */
	public boolean unZip(String zipFileName, String destDir) {
		Project prj = new Project();
		Expand expand = new Expand();
		expand.setProject(prj);
		expand.setSrc(new File(zipFileName));
		expand.setOverwrite(false); // 是否覆盖
		File file = new File(destDir);
		expand.setDest(file);
		expand.setEncoding(encoding);
		expand.execute();

		return true;
	}

} 